package com.jie.langlangmall.portal.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.jie.langlangmall.common.constant.DeleteStatus;
import com.jie.langlangmall.mapper.OmsCartItemMapper;
import com.jie.langlangmall.model.OmsCartItem;
import com.jie.langlangmall.model.OmsCartItemExample;
import com.jie.langlangmall.model.UmsMember;
import com.jie.langlangmall.portal.dao.ProductDao;
import com.jie.langlangmall.portal.domain.CartProduct;
import com.jie.langlangmall.portal.domain.CartPromotionItem;
import com.jie.langlangmall.portal.service.OmsCartItemService;
import com.jie.langlangmall.portal.service.OmsPromotionService;
import com.jie.langlangmall.portal.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author Jie
 * @Date 2024/11/26
 * @Email 3217998214@qq.com
 * @Description
 */
@Service
public class OmsCartItemServiceImpl implements OmsCartItemService {

    @Autowired
    private OmsCartItemMapper cartItemMapper;
    @Autowired
    private ProductDao productDao;
    @Autowired
    private OmsPromotionService promotionService;
    @Autowired
    private UmsMemberService memberService;


    /**
     * 获取包含促销活动信息的购物车列表
     *
     * @param memberId
     * @param cartIds
     * @return
     */
    @Override
    public List<CartPromotionItem> listPromotion(Long memberId, List<Long> cartIds) {
        List<OmsCartItem> cartItemList = list(memberId);
        // 先获取选中的购物车商品
        if (CollUtil.isNotEmpty(cartIds)) {
            cartItemList = cartItemList.stream().filter(item -> cartIds.contains(item.getId())).collect(Collectors.toList());
        }
        // 再获取这些商品的相信信息（包括促销信息）
        List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(cartItemList)) {
            cartPromotionItemList = promotionService.calcCartPromotion(cartItemList);
        }
        return cartPromotionItemList;
    }

    /**
     * 根据用户ID获取购物车
     * @param memberId
     * @return
     */
    @Override
    public List<OmsCartItem> list(Long memberId) {
        OmsCartItemExample example = new OmsCartItemExample();
        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(memberId);
        return cartItemMapper.selectByExample(example);
    }

    /**
     * 添加商品到购物车中
     * @param cartItem
     */
    @Override
    @Transactional
    public void add(OmsCartItem cartItem) {
        // TODO: 返回的商品图片需要是SKU对应的图片
        // 1. 查询当前用户购物车中是否已经有该商品
        UmsMember member = memberService.getCurrentMember();
        cartItem.setMemberId(member.getId());
        cartItem.setMemberNickname(member.getNickname());
        cartItem.setDeleteStatus(0);
        OmsCartItem existCartItem = getCartItem(cartItem);
        // 2. 如果当前购物车中没有该商品，插入商品
        if (existCartItem == null) {
            cartItem.setModifyDate(new Date());
            cartItem.setCreateDate(new Date());
            cartItemMapper.insert(cartItem);
        } else {
            // 3. 如果已经有该商品了，添加数量
            existCartItem.setQuantity(existCartItem.getQuantity() + cartItem.getQuantity());
            existCartItem.setModifyDate(new Date());
            cartItemMapper.updateByPrimaryKey(existCartItem);
        }

    }

    /**
     * 更新购物车中商品的数量
     * @param id
     * @param memberId
     * @param quantity
     */
    @Override
    public void updateQuantity(Long id, Long memberId, Integer quantity) {
        // 1. 如果数量是0，删除该商品
        if (quantity <= 0) {
            // TODO: 如果是0，需要直接删除该商品吗？
            delete(id, Collections.singletonList(memberId));
            return;
        }
        // 2. 修改数量
        OmsCartItem cartItem = new OmsCartItem();
        cartItem.setQuantity(quantity);
        OmsCartItemExample example = new OmsCartItemExample();
        example.createCriteria().andDeleteStatusEqualTo(DeleteStatus.NO_DELETE.getCode())
                .andIdEqualTo(id).andMemberIdEqualTo(memberId);
        cartItemMapper.updateByExampleSelective(cartItem, example);
    }

    /**
     * 删除购物车中的商品
     * @param memberId
     * @param ids
     */
    @Override
    public void delete(Long memberId, List<Long> ids) {
        OmsCartItem record = new OmsCartItem();
        record.setDeleteStatus(1);
        OmsCartItemExample example = new OmsCartItemExample();
        example.createCriteria().andIdIn(ids).andMemberIdEqualTo(memberId);
        cartItemMapper.updateByExampleSelective(record, example);
    }

    /**
     * 获取购物车中的商品规格
     * @param productId
     * @return
     */
    @Override
    public CartProduct getCartProduct(Long productId) {
        return productDao.getCartProduct(productId);
    }

    /**
     * 修改购物车中的商品规格
     * @param cartItem
     */
    @Override
    @Transactional
    public void updateAttr(OmsCartItem cartItem) {
        // 删除原来的信息
        OmsCartItem updateCart = new OmsCartItem();
        updateCart.setId(cartItem.getId());
        updateCart.setModifyDate(new Date());
        updateCart.setDeleteStatus(1);
        cartItemMapper.updateByPrimaryKeySelective(updateCart);
        cartItem.setId(null);
        add(cartItem);
    }

    /**
     * 清空购物车
     * @param memberId
     */
    @Override
    public void clear(Long memberId) {
        OmsCartItem record = new OmsCartItem();
        record.setDeleteStatus(1);
        OmsCartItemExample example = new OmsCartItemExample();
        example.createCriteria().andMemberIdEqualTo(memberId);
        cartItemMapper.updateByExampleSelective(record, example);
    }

    /**
     * 根据用户ID，商品规格和商品ID获取购物车中的商品
     * @param cartItem
     * @return
     */
    private OmsCartItem getCartItem(OmsCartItem cartItem) {
        OmsCartItemExample example = new OmsCartItemExample();
        OmsCartItemExample.Criteria criteria = example
                .createCriteria()
                .andDeleteStatusEqualTo(DeleteStatus.NO_DELETE.getCode())
                .andProductIdEqualTo(cartItem.getProductId());
        // 特定的商品SKU
        if (cartItem.getProductSkuId() != null) {
            criteria.andProductSkuIdEqualTo(cartItem.getProductSkuId());
        }
        List<OmsCartItem> cartItemList = cartItemMapper.selectByExample(example);
        if (!CollectionUtils.isEmpty(cartItemList)) {
            return cartItemList.get(0);
        }
        return null;
    }

}
